# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/265858

import win32api
import win32con
import win32file
from StringIO import StringIO

class GetSysInformation:
    '''
    '''
    def __init__(self):
        # variable to write a flat file
        self.fileHandle = None
        self.HKEY_CLASSES_ROOT = win32con.HKEY_CLASSES_ROOT 
        self.HKEY_CURRENT_USER = win32con.HKEY_CURRENT_USER 
        self.HKEY_LOCAL_MACHINE = win32con.HKEY_LOCAL_MACHINE
        self.HKEY_USERS = win32con.HKEY_USERS
        self.FILE_PATH = "c:/AFT/out" + win32api.GetComputerName()
        self.CONST_OS_SUBKEY = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"
        self.CONST_PROC_SUBKEY = "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0"
        self.CONST_SW_SUBKEY = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"        

    def getSysInfo(self):
        #try:
        hCounter=0
        hProcessorName=""
        # connecting to the base
        hHandle = win32api.RegConnectRegistry(None,self.HKEY_LOCAL_MACHINE)
        # opening the sub key to get the processor name
        #print "debug1"
        hHandle = win32api.RegOpenKeyEx(self.HKEY_LOCAL_MACHINE,self.CONST_PROC_SUBKEY,0,win32con.KEY_ALL_ACCESS)
        hNoOfKeys = win32api.RegQueryInfoKey(hHandle)[1]
        while hCounter < hNoOfKeys:           
            hData = win32api.RegEnumValue(hHandle,hCounter)
            if hData[0]== "Identifier":
                hProcessorName = hData[1]
            hCounter = hCounter + 1
        if hProcessorName=="":
                hProcessorName = "Processor Name Cannot be determined"
                self.preparefile("Processor Name",hProcessorName)
        hCompName = win32api.GetComputerName()
        self.preparefile("Computer Name",hCompName)
        hDomainName = win32api.GetDomainName()
        self.preparefile("Domain Name",hDomainName)
        hUserName = win32api.GetUserName()
        self.preparefile("User Name",hUserName)
        # getting OS Details
        hCounter=0
        # opening the sub key to get the processor name
        hHandle = win32api.RegOpenKeyEx(self.HKEY_LOCAL_MACHINE,self.CONST_OS_SUBKEY,0,win32con.KEY_ALL_ACCESS)
        hNoOfKeys = win32api.RegQueryInfoKey(hHandle)[1]
        hOSVersion=""
        hOSName=""        
        while hCounter < hNoOfKeys:           
            hData = win32api.RegEnumValue(hHandle,hCounter)
            if hData[0]== "ProductName":
                hOSName = hData[1]
                self.preparefile("OS Name",hOSName)
                break
            hCounter = hCounter + 1
        if hOSName=="":
                self.preparefile("OS Name","OS Name could not be read from the registry")
        hCounter = 0 
        while hCounter < hNoOfKeys:
            hData = win32api.RegEnumValue(hHandle,hCounter)            
            if hData[0]== "CSDVersion":
                hOSVersion = hData[1]
                self.preparefile("OS Version",hOSVersion)
                break
            hCounter = hCounter + 1
        if hOSVersion=="":
            self.preparefile("OS Version","OS Version could not be read from the registry")
        # inserting master data
        #insertMachineMaster(hCompName,hDomainName,hOSName,hOSVersion,hProcessorName)
        #except:
        #    self.preparefile("Exception","in Exception in getSysDetails")

    def getSoftwareList(self):
        #try:
        hCounter=0
        hAttCounter=0
        # connecting to the base
        hHandle = win32api.RegConnectRegistry(None,win32con.HKEY_LOCAL_MACHINE)
        # getting the machine name and domain name
        hCompName = win32api.GetComputerName()
        hDomainName = win32api.GetDomainName()
        # opening the sub key to get the list of Softwares installed
        hHandle = win32api.RegOpenKeyEx(self.HKEY_LOCAL_MACHINE,self.CONST_SW_SUBKEY,0,win32con.KEY_ALL_ACCESS)
        # get the total no. of sub keys
        hNoOfSubNodes = win32api.RegQueryInfoKey(hHandle)
        # delete the entire data and insert it again
        #deleteMachineSW(hCompName,hDomainName)
        # browsing each sub Key which can be Applications installed
        while hCounter < hNoOfSubNodes[0]:
            hAppName = win32api.RegEnumKey(hHandle,hCounter)
            hPath = self.CONST_SW_SUBKEY + "\\" + hAppName
            # initialising hAttCounter
            hAttCounter = 0
            hOpenApp = win32api.RegOpenKeyEx(self.HKEY_LOCAL_MACHINE,hPath,0,win32con.KEY_ALL_ACCESS)
            # [1] will give the no. of attributes in this sub key
            hKeyCount = win32api.RegQueryInfoKey(hOpenApp)
            hMaxKeyCount = hKeyCount[1]
            hSWName = ""
            hSWVersion = ""
            while hAttCounter < hMaxKeyCount:
                hData = win32api.RegEnumValue(hOpenApp,hAttCounter)                    
                #print "\n"
                if hData[0]== "DisplayName":
                    hSWName = hData[1]
                    self.preparefile("SW Name",hSWName)
                elif hData[0]== "DisplayVersion":
                    hSWVersion = hData[1]
                    self.preparefile("SW Version",hSWVersion)
                hAttCounter = hAttCounter + 1
            #if (hSWName !=""):
            #insertMachineSW(hCompName,hDomainName,hSWName,hSWVersion)
            hCounter = hCounter + 1           
        #except:
        #    self.preparefile("Exception","In exception in getSoftwareList")

    def openFile(self):
        try:
            self.fileHandle = open(self.FILE_PATH,'w')
        except:
            print "Exceptions in openFile"

    def preparefile(self,printCaption,printString):
        try:
            printText = printCaption + " : " + printString
            print printText
            if self.fileHandle:
              self.fileHandle.write(printText + "\n")        
        except:
            print "In Exception of Prepare file"

    def closeFile(self):
        try:
            self.fileHandle.close()
        except:
            print "Exceptions in closeFile"

if __name__ == "__main__":
  sysinfo=GetSysInformation()
  sysinfo.openFile()
  sysinfo.getSysInfo()
  sysinfo.getSoftwareList()
